package com.liusand.images.listener;

import com.alibaba.fastjson.JSON;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.liusand.common.utils.Base64Utils;
import com.liusand.images.config.Oss;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.Map;


/**
 * @author :liusha
 * packageName :com.liusand.images.listener
 * fileName :MqListener
 * creationTime :2022/12/23 16:53
 */
@Component
public class MqListener{

    @Autowired
    private Oss oss;

    @RabbitListener(
            bindings = @QueueBinding(
                    // @Queue注解里面，接收一个参数，参数代表队列的名称
                    value = @Queue("queue.images"),
                    // @Exchange注解里面接收一个参数，参数代表交换器的名称
                    // 这里声明的交换器名称，要和发送的时候的交换器名称保持一致
                    exchange = @Exchange("exchange.images"),
                    // key相当于是给消息打了一个标签，
                    // 发送消息的时候，会给消息打标签，接收消息的时候，要声明当前收件人要接收哪些标签的消息
                    // key可以声明多个，多个用 {}
                    key = {"image"}
            )
    )
    public void listener(String message) {
        Map map = JSON.parseObject(message,Map.class);
        String fileName = (String)map.get("fileName");
        String fileBase64String = (String)map.get("file");
        InputStream inputStream = Base64Utils.base2InputStream(fileBase64String);
        sendOssToAliyun(fileName, inputStream);
        System.out.println("文件上传成功:" + fileName);
    }

    public void sendOssToAliyun(String fileName, InputStream inputStream){
        // OSS核心代码
        // build方法（参数1，参数2，参数3）
        // 参数1：endpoint：oss-cn-beijing.aliyuncs.com
        // 参数2：根据上述教程获取（账号）
        // 参数3：根据上述教程获取（密码）
        OSS ossClient = new OSSClientBuilder().build(oss.getEndpoint(), oss.getAccessKey(), oss.getSecret());

        // putObject(参数1，参数2，参数3）
        // 参数1：bucketName（取自bucket域名的第一段，类似：tom-tanhua）
        // 参数2：filename，上传到oss上后的存储路径
        // 参数3：文件内容（字节输入流）
        ossClient.putObject(oss.getBucketName(), fileName, inputStream);

        // 关闭（结束）
        ossClient.shutdown();
    }
}
